package cn.jhh.content.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 代码生成器执行类
 */
public class GeneratorExecutor {

    /**
     * 使用默认配置生成指定表的代码
     * @param tables 需要生成的表名，可变参数，无需添加表前缀
     */
    public static void execute(String... tables) {
        GeneratorConfig config = GeneratorConfig.createConfig();
        
        // 将表名添加表前缀
        List<String> tableList = Arrays.asList(tables);
        for (int i = 0; i < tableList.size(); i++) {
            tableList.set(i, config.getTablePrefix() + tableList.get(i));
        }
        
        config.setTables(tableList);
        execute(config);
    }
    
    /**
     * 使用自定义配置生成代码
     * @param config 自定义配置
     */
    public static void execute(GeneratorConfig config) {
        FastAutoGenerator.create(config.getUrl(), config.getUsername(), config.getPassword())
            // 全局配置
            .globalConfig(builder -> {
                builder.author(config.getAuthor())
                      .commentDate("yyyy-MM-dd")
                      .outputDir(config.getOutputDir());
                
                if (config.isFileOverride()) {
                    builder.fileOverride();
                }
                
                if (config.isEnableSwagger()) {
                    builder.enableSwagger();
                }
                
                // 禁止打开输出目录
                builder.disableOpenDir();
            })
            // 包配置
            .packageConfig(builder -> {
                builder.parent(config.getPackageName())
                      .entity("model.entity")
                      .service("service")
                      .serviceImpl("service.impl")
                      .mapper("mapper")
                      .controller("controller")
                      .pathInfo(Collections.singletonMap(OutputFile.xml, config.getMapperXmlPath()));
            })
            // 策略配置
            .strategyConfig(builder -> {
                builder.addInclude(config.getTables())
                      .addTablePrefix(config.getTablePrefix())
                      // Entity策略配置
                      .entityBuilder()
                      .enableLombok()
                      .enableTableFieldAnnotation() 
                      .logicDeleteColumnName(config.getLogicDeleteField())
                      .enableFileOverride()
                      
                      // Controller策略配置
                      .controllerBuilder()
                      .enableRestStyle()
                      .enableHyphenStyle()
                      .enableFileOverride()
                      
                      // Service策略配置
                      .serviceBuilder()
                      .formatServiceFileName("%sService")
                      .formatServiceImplFileName("%sServiceImpl")
                      .enableFileOverride()
                      
                      // Mapper策略配置
                      .mapperBuilder()
                      .enableMapperAnnotation()
                      .enableBaseResultMap()
                      .enableBaseColumnList()
                      .enableFileOverride();
            })
            .templateEngine(new FreemarkerTemplateEngine())
            .execute();
        
        System.out.println("=== 代码生成完成 ===");
        System.out.println("生成的表: " + config.getTables());
        System.out.println("输出目录: " + config.getOutputDir());
    }
    
    /**
     * 示例：生成课程相关表
     */
    public static void main(String[] args) {
        // 生成表（无需添加表前缀）
        execute("course", "course_category");
    }
} 